#include <bits/stdc++.h>
#define int unsigned long long  // 注意这里面需要使用 u long long 
using namespace std;

const int maxn = 1e5 + 10;
const int base=131;
char s[maxn];
int h[maxn];
int bs[maxn];
int n;
int getHash(int l, int r){
	return h[r]-h[l-1]*bs[r-l+1];
}

void strHash(){
	bs[0]=1;
	for (int i=1;i<=n;i++) {
		bs[i]=bs[i-1]*base;
		h[i]=h[i-1]*base +s[i];
	}
}

bool check(int v){
	unordered_map<int, int> ump;
	for (int i=1;i+v-1<=n;i++) {
		int x=getHash(i, i+v-1);
		if (ump.find(x)!=ump.end()) {// 找到了
			if (ump[x]+v-1<i) { // 没有重叠
				return true;
			} // 重叠了也不用放置,因为之前的一定是最靠前的
		} else {
			ump[x]=i;
		}
	}
	return false;
}

void solve(){
	cin>>(s+1);
	// 先字符串 hash
	n=strlen(s+1);
	strHash();
	// 开始二分长度
	int l=0;
	int r=n+1;
	while(l<r-1){
		int m=((r-l)>>1)+l;
		if (check(m)) {
			l=m;
		} else {
			r=m;
		}
	}
	cout << l<<"\n";
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
